/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gradiente;

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.ListIterator;
import javax.swing.JFrame;

/**
 *
 * @author Sagrevyum
 */
public class cliente {
    
    static int foodRest;
    static LinkedList moves;
    int feromonaC[][];
    int feromonaE[][];
    
    public static void main(String[] args) throws ClassNotFoundException, IOException {

        cliente client = new cliente();        
        
    }
    
    cliente() throws ClassNotFoundException, IOException {
        try {
            Socket socket = new Socket("localhost", 5000);
            InputStream aux = socket.getInputStream();
            ObjectInputStream entradaObjetos = new ObjectInputStream(aux);
            OutputStream aux2 = socket.getOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(aux2);

            // Leer estado inicial
            Inicial mapa;
            mapa = (Inicial) entradaObjetos.readObject();
            System.out.println("Recibi el mapa");
            
            // Crea los paneles
            
            JFrame aplicacion = new JFrame("Comida");
            int l = 600/mapa.n;
            Gradiente panelDibujo = new Gradiente(mapa.n * 2, mapa.m * 2, l);
            aplicacion.add(panelDibujo);
            aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            aplicacion.setSize((mapa.m * l)+20, (mapa.n * l)+20);        
            aplicacion.setVisible(true);
            
            aplicacion = new JFrame("Exploracion");
            panelDibujo = new Gradiente(mapa.n * 2, mapa.m * 2, l);
            aplicacion.add(panelDibujo);
            aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            aplicacion.setSize((mapa.m * l)+20, (mapa.n * l)+20);        
            aplicacion.setVisible(true);
            
            ArrayList lista;
            lista = new ArrayList();
            int k = 1;
            for (int x = 0; x < mapa.getExploradoras(); x++) {
                lista.add(new Hormiga(k++, 0, mapa.n, mapa.m));
            }
            for (int x = 0; x < mapa.getGuerreras(); x++) {
                lista.add(new Hormiga(k++, 1, mapa.n, mapa.m));
            }
            for (int x = 0; x < mapa.getObreras(); x++) {
                lista.add(new Hormiga(k++, 2, mapa.n, mapa.m));
            }

            // Inicializar las matrices de las feromonas con las dimesiones del mapa
            feromonaC = new int[2 * mapa.n][2 * mapa.m];
            feromonaE = new int[2 * mapa.n][2 * mapa.m];
            
            while (true) {
                // Recibir vistas
                AntsView vista;
                vista = (AntsView) entradaObjetos.readObject();
                System.out.println("Recibi el AntsView");
                // Logica
                MoveList movimientos = new MoveList();
                ListIterator itr = lista.listIterator();
                
                while (itr.hasNext()) {
                    Hormiga ant = (Hormiga) itr.next();
                    Perspective p = (Perspective) vista.perspectiva.get(ant.id);
                    int[][] fC = new int[3][3];
                    for (int y = 0; y < 3; y++) {
                        for (int x = 0; x < 3; x++) {
                            fC[y][x] = feromonaC[ant.p.y + y - 1][ant.p.x + x - 1];
                        }
                    }
                    int[][] fE = new int[3][3];
                    for (int y = 0; y < 3; y++) {
                        for (int x = 0; x < 3; x++) {
                            fE[y][x] = feromonaC[ant.p.y + y - 1][ant.p.x + x - 1];
                        }
                    }
                    Respuesta r = ant.getMovimiento((Perspective) vista.perspectiva.get(ant.id), fC, fE);
                    movimientos.agregar(new Move(ant.id, r.direccion));
                    for (int y = 0; y < 3; y++) {
                        for (int x = 0; x < 3; x++) {
                            fC[ant.p.y + y - 1][ant.p.x + x - 1] += r.dC[y][x];
                            fE[ant.p.y + y - 1][ant.p.x + x - 1] += r.dE[y][x];
                        }
                    }
                }
                // Mandar movimientos
                os.writeObject(movimientos);
                System.out.println("Mande los movimientos");
                try {
                    Thread.sleep(300);
                } catch (Exception e) {
                }
            }
        } catch (Exception e) {
        }
    }
}
